package com.example.springmvc;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/**
 * 【响应】
 * @Controller [返回视图] :定义⼀个控制器, Spring 框架启动时加载,把这个对象交给 Spring 管理.
 * @RestController 返回数据
 * @RestController = @Controller + @ResponseBody
 * @ResponseBody :定义返回的数据格式为非视图,返回一个 text/html 信息. 加在类上：表示该类的所有方法都返回数据；加在方法上：表示该方法返回数据
 */
@Controller
@RequestMapping("/response")
public class ResponseController {
    /**
     * 返回静态页面
     */
    // @ResponseBody 加上 @ResponseBody 注解, 该方法就会把 "/index.html" 当做一个数据返回给前端.
    @RequestMapping("/returnPage")
    public String returnPage(){
        return "/index_1.html";
    }

    /**
     * 返回HTML代码片段
     * 响应的 Content-Type: text/html 即 body 数据格式是 HTML
     */
    @ResponseBody
    @RequestMapping("/returnHtml")
    public String returnHtml(){
        return "<h1>我是一级标题</h1>";
    }

    /**
     * 返回 JSON. 后端方法返回结果为对象
     * Content-Type: application/json，前端可以直接当对象使用
     * 如果返回的是 text/html,text/plain，前端需要把字符串转为对象
     */
    @ResponseBody
    @RequestMapping("/returnJson")
    public Person returnJson(){
        return new Person("zhangsan",1,18);
    }

    @ResponseBody
    @RequestMapping("/returnJson2")
    public Map<String,String> returnJson2(){
        Map<String,String> map = new HashMap<>();
        map.put("id","1");
        map.put("name","zhangsan");
        return map;
    }

    /**
     * 设置状态码
     * @param response HttpServletResponse是SpringMVC的内置对象，需要时直接在方法中添加声明即可
     *                 http响应里有什么，这个对象就有什么
     */
    @ResponseBody
    @RequestMapping("/setStatus")
    public String setStatus(HttpServletResponse response){
        response.setStatus(400);
        return "设置状态码成功";
    }

    /**
     * 设置 Header
     * 通过 @RequestMapping 注解的属性来实现. 查看 @RequestMapping 的源码:
     * value:指定映射的 URL
     * produces:指定返回的内容类型，还可以同时设置返回值的字符编码
     */
    // 设置Content-Type
    @ResponseBody
    // 如果不设置produces，方法返回结果为String时，Spring MVC默认返回类型是 text/html
    @RequestMapping("/setContentType")
    public String setContentType(){
        return "{\"OK\":1}";
    }

    @ResponseBody
    @RequestMapping(value = "/setContentType2",produces = "application/json")
    public String setContentType2(){
        return "{\"OK\":1}";
    }

    //设置其他Header，需要使用Spring MVC的内置对象 HttpServletResponse 提供的方法来进行设置
    @ResponseBody
    @RequestMapping("/setHeader")
    public String setHeader(HttpServletResponse response){
        // void setHeader(String name, String value)设置⼀个带有给定的名称和值的header.如果name已经存在，则覆盖旧的值.
        response.setHeader("My-Header","myHeader");
        return "设置Header成功";
    }

}
